/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.backend.bean;

import com.nys.conci.backend.entidad.Identidad;
import com.nys.conci.backend.entidad.MenuControlador;
import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EncriptaUtil;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.cliente.entidad.Persona;
import com.nys.conci.usuario.entidad.Usuario;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.util.Iterator;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.inject.Inject;
import org.jboss.weld.context.SerializableContextualInstanceImpl;

/**
 *
 * @author Yeudy10
 */
@ManagedBean
@ViewScoped
public final class BeanLogin extends BeanBase {

    @Inject
    private ServicioControlUsuario scu;
    private String usuario;
    private String password;
    private String navegacion_login;
    @Inject
    private Identidad identidad;
    private final String CONCI_HOME = "/xhtml/paginas/citas/consulta_citas";
    private final String CONCI_HOME_USER = "/xhtml/paginas/citas/citas_usuario";

    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>>  Inicializadores   <<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    /**
     * Constructor
     */
    public BeanLogin() {
        this.inicializar();
    }

    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>><<>>   METODOS  <<>><<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    /**
     * Inicializa las variables
     */
    public void inicializar() {
    }

    /**
     * Inicializa las variables del bean
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
    }

    public boolean validarCampos() {
        boolean resultado = true;

        if (usuario == null || usuario.isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Usuario");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_usuario", mensaje);
            resultado = false;
        }

        if (password == null || password.isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Clave");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_clave", mensaje);
            resultado = false;
        }

        return resultado;
    }

    /**
     * Método encargado de realizar la acción de acceder al sistema. Primero se
     * autentica por medio del RNPAutentica, si este está correcto, procede a la
     * autorización interna del SistemaSBI.
     *
     * @param evento Evento del botón Acceder.
     */
    public void logIn(ActionEvent evento) {
        if (evento.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
            evento.setPhaseId(PhaseId.INVOKE_APPLICATION);
            evento.queue();
        } else {
            try {
                this.navegacion_login = "";
                if (!validarCampos()) {
                    return;
                }

                Usuario usu = new Usuario();           
                String pass = EncriptaUtil.getInstancia().encriptar(password, EncriptaUtil.Algoritmo.MD5);
                String pass1 = EncriptaUtil.getInstancia().encriptar(pass, EncriptaUtil.Algoritmo.SHA256);
                usu = scu.consultarUsuarioLogin(usuario, pass);

                if (usu != null) {
                    colocarEnSesion(usu);                    
                } else {
                    Usuario x = new Usuario();
                    x = scu.consultarUsuario(usuario);
                    String mensaje = "";
                    if (x == null) {
                        mensaje = "Usuario no existe";
                        MensajeUtil.agregarMensajeError(mensaje);
                    } else {
                        mensaje = "Contraseña incorrecta";
                        MensajeUtil.agregarMensajeErrorComponente("form_conci:id_clave", mensaje);
                    }
                }

            } catch (Exception ex) {
                ExcepcionManager.manejarExcepcion(ex);
            }
        }
    }

    private void colocarEnSesion(Usuario us) {

        Persona persona = new Persona();
        persona = scu.consultarPersona(us.getIdentificacion());

        if (us.getTipo_usuario().equals("U")) {
            identidad.setMenu_usuario(true);
            identidad.setMenu_admin(false);
            identidad.setLogueado(true);
            this.navegacion_login = CONCI_HOME_USER;

        }
        if (us.getTipo_usuario().equals("A")) {
            identidad.setMenu_usuario(false);
            identidad.setMenu_admin(true);
            identidad.setLogueado(true);
            this.navegacion_login = getCONCI_HOME();
        }

        identidad.setIdentificacion(us.getIdentificacion());
        identidad.setNombre(persona.getNombre() + " " + persona.getApellido1() + " " + persona.getApellido2());
    }

    /**
     * Método encargado de la navegación para la acción de login. Retorna la
     * regla de navegación setean en el actionListener del botón, según el
     * resultado de la validación y login.
     *
     * @return Regla de navegación.
     */
    public String logIn() {
        return this.navegacion_login;
    }

    /**
     * Método encargado de resetear los datos de la sesión.
     */
    private void resetearDatosSesion() {
        identidad.setLogueado(false);
        identidad.setMenu_admin(false);
        identidad.setMenu_usuario(false);
        identidad.setNombre(null);
        identidad.setIdentificacion(null);
        identidad = null;
    }

    /**
     * Método encargado de la accion de terminar la sesión del usuario. Setea
     * las variables de identificación del usuario en
     * <code>null</code>, la navegación tambien son seteadas a
     * <code>null</code>, y redirige a una pantalla de despedida del sistema.
     *
     * @return Regla de navegación.
     */
    public String terminarSesion() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        try {
            resetearDatosSesion();

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return "/xhtml/plantillas/login";
    }

    public String accionSalir() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
        Iterator it = sessionMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry ent = (Map.Entry) it.next();
            if (ent.getValue() instanceof SerializableContextualInstanceImpl) {
                SerializableContextualInstanceImpl impl = (SerializableContextualInstanceImpl) ent.getValue();
                if (impl.getInstance() instanceof Identidad || impl.getInstance() instanceof MenuControlador) {
                    it.remove();
                }
            }
        }//WHILE 
        resetearDatosSesion();
        return "/xhtml/plantillas/login";
    }

    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>>  GETTERS y SETTERS <<>><<>><<>><<>><<>><<>><<>>
    //<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public boolean isPreMensaje() {
        return false;
    }

    /**
     * @return the CONCI_HOME
     */
    public String getCONCI_HOME() {
        return CONCI_HOME;
    }
}
